/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui.Almacen;

import Controlador.Bean.Almacen.EntradaSalida;
import Controlador.Bean.Almacen.Producto;
import Controlador.Bean.Almacen.ProdxSolicitudMovimiento;
import Controlador.Bean.Almacen.SolicitudMovimiento;
import gui.General.Main;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author César
 */
public class PanelSolicitudes extends javax.swing.JPanel {

    /**
     * Creates new form PanelSolicitudes
     */
    TableModel tb;
    String estado;
    Date today;
    GestionAlmacenes gt;
    public PanelSolicitudes(GestionAlmacenes gt) {
        today = new Date();
        this.gt = gt;
        initComponents();
        initComp();
    }
    
    public void putData(String estado){
        this.estado = estado;
        asignarNombre(tb);
        tblSolicitudes.setModel(tb);
        jdpFecha.setDate(today);
        tb.actualizarTabla();
    }
    
    public void initComp(){
        tb = new TableModel();
        today = new Date();
        tblSolicitudes.setDefaultRenderer(JButton.class, new MiRender());
        tblSolicitudes.setDefaultEditor( JButton.class, new MiEditor());
    }

    public class MiRender implements TableCellRenderer {
        // Este metodo indica como debe de pintarse el elemento en la fila row, en la columna column
        // que esta en la tabla table y tiene el color dado por el objeto.
        @Override
        public Component getTableCellRendererComponent(JTable table, Object color, boolean isSelected, boolean hasFocus, int row, int column) {    
            // como el boton y el calendario son componentes esto se vale.
            return (JComponent)table.getValueAt(row, column);
        }
     }
     
     public class MiEditor extends AbstractCellEditor implements TableCellEditor {
         private Boolean currentValue;
         @Override
         public Object getCellEditorValue()
         {
            return currentValue;
         }
         //El editor usara el propio componente. Para que funcione la celda en el modelo debe ser editable.
         @Override
         public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
         {
           return (JComponent) value;// la tabla solo debe tener componentes graficos
         }
     }
    
    public void asignarNombre(TableModel tb){
        if(estado.compareTo("1")==0){
            String[] data = {"Id Solicitud", "Encargado", "Tipo", "Fecha", "Detalle", "Aceptar"};
            tb.columnNames = data;
        }else{
            String[] data = {"Id Solicitud", "Encargado", "Tipo", "Fecha", "Detalle"};
            tb.columnNames = data;
        }
        
    }
    
    class TableModel extends AbstractTableModel{
              
        //Two arrays used for the table data
        String[] columnNames = {"Id Solicitud", "Encargado", "Tipo", "Fecha", "Detalle"};
                    
        List<SolicitudMovimiento> data = Controlador.Service.Almacen.GestionAlmacenes.obtenerSolicitudMovimientoporEstado("1", today);
        
        public void actualizarTabla(){
            data = Controlador.Service.Almacen.GestionAlmacenes.obtenerSolicitudMovimientoporEstado(estado, jdpFecha.getDate());
            fireTableDataChanged();
        }
        
        @Override
        public int getRowCount()
        {
            return data.size();
        }
        
        @Override
        public int getColumnCount()            
        {
            return columnNames.length;
        }
        
        @Override
        public Object getValueAt(int row, int column)
        {   
            if(estado.compareTo("1")!=0){
                switch(column){
                    case 0: return data.get(row).getIdSolicitudMovimiento();
                    case 1: return data.get(row).getIdEmpleadoAdm();
                    case 2: return data.get(row).getTipo();
                    case 3: return data.get(row).getFecha();
                    default: return new JButton("Detalle");
                }
            }else{
                switch(column){
                    case 0: return data.get(row).getIdSolicitudMovimiento();
                    case 1: return data.get(row).getIdEmpleadoAdm();
                    case 2: return data.get(row).getTipo();
                    case 3: return data.get(row).getFecha();
                    case 4: return new JButton("Detalle");
                    default: return new JButton("Aceptar/Rechazar");
                }
            }
        }
        
        //Used by the JTable object to set the column names
        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }
        
        //Used by the JTable object to render different
        //functionality based on the data type
        @Override
        public Class getColumnClass(int c) {
            if(c!=4){
            return getValueAt(0, c).getClass();
            }else{
                return JButton.class;
            }
        }
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblSolicitudes = new javax.swing.JTable();
        jdpFecha = new org.jdesktop.swingx.JXDatePicker();
        jLabel1 = new javax.swing.JLabel();

        jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
        jPanel1.setLayout(new java.awt.BorderLayout());

        tblSolicitudes.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tblSolicitudes.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tblSolicitudesMouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(tblSolicitudes);

        jPanel1.add(jScrollPane1, java.awt.BorderLayout.CENTER);

        jdpFecha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jdpFechaActionPerformed(evt);
            }
        });

        jLabel1.setText("Fecha de Solicitudes");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 564, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jdpFecha, javax.swing.GroupLayout.PREFERRED_SIZE, 127, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jdpFecha, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE)
                .addContainerGap())
        );
    }// </editor-fold>//GEN-END:initComponents

    private void tblSolicitudesMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblSolicitudesMouseClicked
        // TODO add your handling code here:        
        int selectedRowIndex = tblSolicitudes.getSelectedRow();
        int selectedColumnIndex = tblSolicitudes.getSelectedColumn();
        if(selectedColumnIndex == 5){
            String [] datos = {"Aceptar", "Rechazar", "Cancelar"};
            int resultado = JOptionPane.showOptionDialog(this, "¿Qué desea hacer con la transacción?", "Elegir", JOptionPane.CLOSED_OPTION ,JOptionPane.QUESTION_MESSAGE, null, datos, "Acepar" );
            if(resultado == 0){
                SolicitudMovimiento solMov = tb.data.get(tblSolicitudes.getSelectedRow());
                List<ProdxSolicitudMovimiento> productosSolicitud = Controlador.Service.Almacen.GestionAlmacenes.obtenerProdxSolicitudMovimiento(solMov.getIdSolicitudMovimiento());
                List<EntradaSalida> entSal = new ArrayList<>();
                List<Producto> productos = Controlador.Service.Almacen.GestionAlmacenes.obtenerProductos();
                List<Producto> productosModificados = new ArrayList<Producto>();
                for(int i=0; i<productosSolicitud.size(); i++){
                    entSal.add(new EntradaSalida("id", solMov.getIdSolicitudMovimiento(), productosSolicitud.get(i).getIdProducto(), solMov.getIdAlmacen(), solMov.getTipo(), today, productosSolicitud.get(i).getCantidad(), solMov.getDescripcion(), "1", Main.usu.getIdEmpleadoAdm(), solMov.getIdEmpleadoAdm(), solMov.getTipoIE()));
                    for(int j = 0; j<productos.size(); j++){
                        if(productos.get(j).getIdProducto() == null ? productosSolicitud.get(i).getIdProducto() == null : productos.get(j).getIdProducto().equals(productosSolicitud.get(i).getIdProducto())){
                            if(solMov.getTipo().equals("Entrada") || solMov.getTipo().equals("Ajuste")){
                                productos.get(j).setCantidad(productosSolicitud.get(i).getCantidad() + productos.get(j).getCantidad());
                            }else{
                                productos.get(j).setCantidad(- productosSolicitud.get(i).getCantidad() + productos.get(j).getCantidad());
                            }                        
                            productosModificados.add(productos.get(j));
                        }
                    }
                }
                solMov.setEstado("2");
                Controlador.Service.Almacen.GestionAlmacenes.actualizarSolicitudMovimiento(solMov);
                Controlador.Service.Almacen.GestionAlmacenes.actualizarProductoxAlmacen(productosSolicitud, solMov.getIdAlmacen(), solMov.getTipo());
                Controlador.Service.Almacen.GestionAlmacenes.actualizarListaProduductos(productosModificados);
                Controlador.Service.Almacen.GestionAlmacenes.agregarTransacciones(entSal);
                tb.actualizarTabla();
                gt.actualizar();
            }else if(resultado == 1){
                Controlador.Service.Almacen.GestionAlmacenes.eliminarSolicitudMovimiento(tb.data.get(selectedRowIndex));
                tb.actualizarTabla();
            }
            JOptionPane.showMessageDialog(this, "Se ha completado la transacción", "Información", JOptionPane.INFORMATION_MESSAGE);
        }else if(selectedColumnIndex == 4){
            DetalleSolicitud dt = new  DetalleSolicitud(tb.data.get(selectedRowIndex));
            Main.getDesktop().add(dt);
            dt.setVisible(true);
        }
    }//GEN-LAST:event_tblSolicitudesMouseClicked

    private void jdpFechaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jdpFechaActionPerformed
        // TODO add your handling code here:
        tb.actualizarTabla();
    }//GEN-LAST:event_jdpFechaActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private org.jdesktop.swingx.JXDatePicker jdpFecha;
    private javax.swing.JTable tblSolicitudes;
    // End of variables declaration//GEN-END:variables
}
